/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

  struct ListNode {
      int val;
      struct ListNode *next;
  };
#include <stdio.h>
#include <stdlib.h>
struct ListNode* rotateRight(struct ListNode* head, int k) {
    if (head == NULL || k == 0) {
        return head;
    }

    // 获取链表长度
    int n = 0;
    struct ListNode* p = head;
    while (p != NULL) {
        n++;
        p = p->next;
    }

    // 计算实际需要移动的次数
    k = k % n;
    if (k == 0) {
        return head;
    }

    // 使用两个指针 p 和 q
    p = head;
    struct ListNode* q = head;

    // 让 p 先走 k 步
    for (int i = 0; i < k; i++) {
        p = p->next;
    }

    // 同时移动 p 和 q，直到 p 到达链表末尾
    while (p->next != NULL) {
        p = p->next;
        q = q->next;
    }

    // 此时 q 是新的尾节点，q->next 是新的头节点
    struct ListNode* new_head = q->next;

    // 断开链表
    q->next = NULL;

    // 将原链表的末尾连接到原链表的头
    p->next = head;

    // 返回新的头节点
    return new_head;
}